const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const cors = require('cors');
const indexRouter = require('./router/index');
const userRouter = require('./router/user');
const artcateRouter = require('./router/artcate');
const userInfoRouter = require('./router/userInfo');
const joi = require('joi');
const app = express();
const config = require('./config');
const expressJWT = require('express-jwt');
const userAvatarRouter = require('./router/user_avatar');
const projectRouter = require('./router/project');
const articleRouter = require('./router/article');
const contactRouter = require('./router/contact');
// 跨域允许
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
// app.use(express.static(path.join(__dirname, 'public')));
// 配置静态文件服务 - 确保头像文件可访问
// app.use('/avatar', express.static(path.join(__dirname, 'public/avatar')));
// app.use('/public/avatar', express.static(path.join(__dirname, 'public/avatar')));

// 添加对根目录的直接访问支持
app.use(express.static(path.join(__dirname, 'public')));

// 封装一个处理响应状态的中间件(一定在路由之前封装就是了)
app.use((req, res, next) => { 
    // 给res对象挂载一个方法cc  用于处理响应状态
    res.cc = (err, status=400) => { 
        res.send({
            status,
            // err可能是错误对象 也可能是字符串
            message:err instanceof Error?err.message:err
        })
    }
    next();
})
// 配置解析token的中间件（放在需要验证的路由之前）
app.use(
  expressJWT({
    secret: config.jetSecretKey,
    algorithms: ["HS256"],
  }).unless({
    path: [/^\/api/],
  })
);
//登录过期 错误处理中间件
app.use((err, req, res, next) => { 
    if (err.name === "UnauthorizedError") { 
      return res.send({
        status: 401,
        data: {
          message: "登录过期，请重新登录",
        },
      })
    }
    res.send({
      status: 500,
      data: {
        message: "服务器内部错误",
      },
    })
  })
// 挂载用户头像路由（确保在token验证之后）
app.use('/api', contactRouter);
app.use('/my', userAvatarRouter);
app.use('/', indexRouter);
app.use('/api', userRouter);
app.use('/my', userInfoRouter);
// ev文章系列路由
app.use('/my/evArticle', artcateRouter);
// 项目系列路由
app.use('/api', projectRouter);
// 文章系列路由
app.use('/api', articleRouter);
// 错误处理中间件（必须放在所有路由之后）
app.use((err, req, res, next) => {
    // 参数验证失败
    if (err instanceof joi.ValidationError) {
        return res.cc(err.message)
    }
})

module.exports = app;
